from prettytable import PrettyTable
import math
import numpy as np
from scipy.stats import t
import matplotlib.pyplot as plt
from scipy.integrate import quad

def student_t_distribution(t, df):
    numerator = math.gamma((df + 1) / 2)
    denominator = math.sqrt(math.pi * df) * math.gamma(df / 2)
    result = numerator / denominator * (1 + t**2 / df) ** (- (df + 1) / 2)
    return result

def cumulative_t_distribution(t, df):
    result, _ = quad(lambda x: student_t_distribution(x, df),float('-inf'),t_val)
    return result


# Создание таблицы
table = PrettyTable()
table.field_names = ['t', 'P(X)','F(X)']

# Значения t для таблицы
t_values = range(-3, 4)

cumulitive_dist=0
# Заполнение таблицы значениями плотности t-распределения
for t_val in t_values:
    cumulative_dist = cumulative_t_distribution(t_val,3)
    row = [t_val, round(student_t_distribution(t_val,3), 3), f"{cumulative_dist:.3f}"]
    table.add_row(row)

# Вывод таблицы
print(table)

# Создание таблицы
table_bibl = PrettyTable()
table_bibl.field_names = ['t', 'P(X)', "F(X)"]

# Значения t для таблицы
t_values_bibl = np.arange(-3, 4)

# Заполнение таблицы значениями плотности t-распределения
for t_val_bibl in t_values_bibl:
    row = [t_val_bibl, round(t.pdf(t_val_bibl,3),3),round(t.cdf(t_val_bibl,3),3)]
    table_bibl.add_row(row)

# Вывод таблицы
print(table_bibl)


# Построение столбчатой диаграммы
fig, ax1 = plt.subplots()

color = 'tab:purple'
ax1.set_ylabel('P(X)', color=color)
values_P = [float(row[1]) for row in table._rows]
ax1.bar(t_values, values_P, color=color, alpha=0.7)
ax1.tick_params(axis='y', labelcolor=color)

ax2 = ax1.twinx()  # создаем вторую ось Y

color = 'tab:green'
ax2.set_ylabel('F(X)', color=color)
values_F = [float(row[2]) for row in table._rows]
ax2.plot(t_values, values_F, color=color, marker='o', label='F(X)')
ax2.tick_params(axis='y', labelcolor=color)

# Настройка графика
plt.title('Распределение Стьюдента')
plt.show()